/*
 * CargadorClases.java	
 *
 * Copyright 2008 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 07/10/2008, 11:23:38 AM
 */
package com.ufps.cuatro.modelo.analizador;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * <i><b>CargadorClases:</b></i> Se encarga de cargar archivos .jar
 * en el classpath en tiempo de ejecución.
 *
 * @author  Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 07/10/08
 */
public class CargadorClases{    
    

    private static final String METODO_ADD_URL = "addURL";
    private static final Class[] PARAMETRO_METODO = new Class[]{URL.class};
    private final URLClassLoader loader;
    private final Method metodoAdd;

    /**
     * Constructor por Defecto.
     * @throws NoSuchMethodException Método no Soportado.
     */
    public CargadorClases() throws NoSuchMethodException {
        loader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        metodoAdd = URLClassLoader.class.getDeclaredMethod(
                                          METODO_ADD_URL, PARAMETRO_METODO);
        metodoAdd.setAccessible(true);
    }

    /**
     * Devuelve el Array de URL's.
     * @return Array de URL's.
     */
    public URL[] getURLs() {
        return loader.getURLs();
    }

    /**
     * Agrega una URL.
     * @param objURL URL que se agregará.
     * @return  
     */
    public Object addURL(URL objURL) {
        if (objURL != null) {
            try {
                return metodoAdd.invoke(loader, new Object[]{objURL});
            } catch (IllegalAccessException ex) {
                Logger.getLogger(CargadorClases.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalArgumentException ex) {
                Logger.getLogger(CargadorClases.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InvocationTargetException ex) {
                Logger.getLogger(CargadorClases.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Agrega un Array de URL.
     * @param objURLs Array de URL.
     * @return  
     */
    public Object addURLs(URL[] objURLs) {
        if (objURLs != null) {
            for (URL url : objURLs) {
                addURL(url);
            }
            return objURLs;
        }
        return null;
    }

    /**
     * Agrega una URL desde un File.
     * @param objFile Archivo.
     * @return 
     * @throws MalformedURLException Formato no válido.
     */
    public Object addArchivo(File objFile) throws MalformedURLException {
        if (objFile != null) {
            return addURL(objFile.toURI().toURL());
        }
        return null;
    }

    /**
     * Agrega una URL desde un String.
     * @param strPathURL Ruta de la URL.
     * @return 
     * @throws MalformedURLException Formato no válido.
     */
    public Object addArchivo(String strPathURL) throws MalformedURLException {
        return addArchivo(new File(strPathURL));
    }
}